/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package SemanticoPacote;

import SemanticoPacote.TratamentoErroSemantico.ErroSemantico;
import compilador_full.TabelaSimbolos;
import java.util.Hashtable;


public class declaracaoConstantes {

    private Hashtable<Integer, String> constantes = new Hashtable<Integer, String>();

    public void semanticaConstantes(TabelaSimbolos tabelasimbolos, int indice) {

        int tamanhoVetor = 0;
        int cont = 0;
        boolean tamanhoCerto = false;
        




        //ARMAZENAR NUMA ESTRUTURA PARA VERIFICAR UNICIDADE

        tabelasimbolos.soConsome();//consome const
        tabelasimbolos.soConsome();//consome int|boolean....



        String tipoDaConstante = tabelasimbolos.getTipoVariavel();//METODO pega o tipo da constante


        if(this.jaContemAquelaConstante(tabelasimbolos.getLookahead(),indice)){
            if(!tabelasimbolos.verificaGlobais(tabelasimbolos.getLookahead())){
                System.out.println("Erro Semântico na linha " +tabelasimbolos.getLinha() + ". Descrição: "+ tabelasimbolos.getLookahead() + " já está definido no programa");
                ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelasimbolos.getLinha() + ". Descrição: "+ tabelasimbolos.getLookahead() + " já está definido no programa");
            }
        }


        tabelasimbolos.soConsome();//consome identificardor


        if (tabelasimbolos.getLookahead().equals("=")) {
            tabelasimbolos.soConsome();//consome o igual

            //    tamanhoVetor = Integer.parseInt(tabelasimbolos.getLookahead());

            if (!tipoDaConstante.equals(Utils.tipoValor(tabelasimbolos.getLookahead()))) {
                System.out.println("ERRO SEMANTICO - Valor incompatível");
                ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelasimbolos.getLinha() + ". Descrição: Valor da variável incompatível com seu tipo");
            }

            tabelasimbolos.soConsome();//consome valor
            tabelasimbolos.soConsome();//consome o ;
            } else {
            if (tabelasimbolos.getLookahead().equals("[")) {
                while (tabelasimbolos.getLookahead().equals("[")) {
                    tabelasimbolos.soConsome();//consome [
                    System.out.println("tamanho do vetor " + tabelasimbolos.getLookahead());

                    if (Utils.tipoValor(tabelasimbolos.getLookahead()).equals("int")) {
                        tamanhoCerto = true;
                        tamanhoVetor = Integer.parseInt(tabelasimbolos.getLookahead());
                    }



                    if (!(Utils.tipoValor(tabelasimbolos.getLookahead())).equals("int")) {
                        System.out.println("ERRO SEMANTICO - Tamanho do vetor deve ser do tipo inteiro");
                        ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " +tabelasimbolos.getLinha() + ". Descrição: Tamanho do vetor deve ser do tipo inteiro");
                        while (tabelasimbolos.getLookahead().equals(";")) {
                            tabelasimbolos.soConsome();//consome o resto
                            }
                    }

                }

                tabelasimbolos.soConsome();//consome tamanho do vetor
                tabelasimbolos.soConsome();//consome ]
                tabelasimbolos.soConsome();//consome =

                tabelasimbolos.soConsome(); //consome {

                while (!tabelasimbolos.getLookahead().equals("}")) {
                    if (!tipoDaConstante.equals(Utils.tipoValor(tabelasimbolos.getLookahead()))) {
                        System.out.println("ERRO SEMEANTICO: valor " + tabelasimbolos.getLookahead() + " não é do tipo " + tipoDaConstante);
                        ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " + tabelasimbolos.getLinha() + ". Descrição: valor " + tabelasimbolos.getLookahead() + " não é do tipo " + tipoDaConstante);
                        tabelasimbolos.soConsome();//consome erro


                    } else {
                        tabelasimbolos.soConsome();//consome o numero certo

                    }

                    cont++;//conta qtd de elementos declarados

                    if (tabelasimbolos.getLookahead().equals("}")) {
                        break;
                    }



                    tabelasimbolos.soConsome();//consome ,


                }
                tabelasimbolos.soConsome();//consome }
                tabelasimbolos.soConsome();//consome ;




                if (tamanhoCerto) {
                    if (tamanhoVetor != cont) {
                        System.out.println("ERRO SEMANTICO - quantidade errada de valores declarados"); //DECLAROU MAIS ELEMENTOS DO QUE DEVERIA
                        ErroSemantico.getInstance().getTabelaErros().add("Erro Semântico na linha " + tabelasimbolos.getLinha() + ". Descrição: quantidade errada de valores declarados");
                    }

                    tamanhoCerto = false;
                }


            }
        }
    }

    public boolean jaContemAquelaConstante(String constante, int indice){
        if(!constantes.contains(constante)){
            constantes.put(indice, constante);
            return false;// retorna false pq nao tinha
        }
        else
            return true;//ja contém aquela constante         
    }


    public void imprimeConstantes(){
        System.out.println("CONSTANTES *****************************");
        for(int i = 0; i< constantes.size(); i++)
            System.out.println(constantes.get(i));

        System.out.println("CONSTANTES *****************************");
    }
}
